import java.util.HashSet;
import java.util.Set;

public class Test4 {
    //面试题 01.01. 判定字符是否唯一
    //链接:https://leetcode.cn/problems/is-unique-lcci/description/
    //解法1  用位运算
    public boolean isUnique(String astr) {
        if(astr.length() > 26) {
            return false;
        }
        //先定义一个位图
        int bit = 0;
        for(int i = 0; i < astr.length(); i++) {
            int x = astr.charAt(i) - 'a';
            //判断一下 比特位里有没有
            if(((bit>>x) & 1 )== 1 ) {
                return false;
            }
            //加进去   把对应的位置变成1
            bit = bit | (1 << x);
        }
        return true;
    }

    //解法2 : 用数组模拟哈希表
    public boolean isUnique1(String astr) {
        int[] hash = new int[200];  //给128就行
        //遍历字符串
        for(int i = 0; i < astr.length(); i++) {
            char ch = astr.charAt(i);
            if(hash[ch] != 0) {
                return false;  //说明有重复出现了

            }
            hash[ch]++;  //把该元素对应的值 加加

        }
        return true;
    }
    //两层循环  两个两个比较  如果有相同就  返回false
    public boolean isUnique2(String astr) {
        int n = astr.length();
        //直接两层for循环  暴力 两个两个比较
        for(int i = 0; i < n; i++) {
            for(int j = i+1; j < n; j++) {
                if(astr.charAt(i) == astr.charAt(j)) {
                    return false;
                }
            }
        }
        return true;
    }
    public boolean isUnique4(String astr) {
        //还有就是用set  如果set加不进去 说明就重复了
        Set<Character> set = new HashSet<>();
        for(int i =0; i < astr.length(); i++) {
            if(!set.add(astr.charAt(i))) {
                return false;
            }
        }
        return true;
    }
    public static void main(String[] args) {

    }
}
